package com.zkingsoft.web.action;

import com.matrix.core.tools.*;
import net.sf.json.JSONObject;

import java.io.IOException;

public class WeChatApiTools {
	/**
	 * 小程序秘钥
	 */
	private static final String XCX_SECRET = "xcx_secret";
	/**
	 * 小程序appid
	 */
	private static final String XCX_APPID = "xcx_appid";
	/**
	 * 微信登录url
	 */
	private static final String WECHAT_LOGIN_URL = "wechar_login_url";

	/**
	 * 上一次获取时间
	 */
	private static Long preTime;

	/**
	 * 当前有效的微信token
	 */
	private static String accessToken = "";

	private static String appid = "";
	private static String secret = "";


	/**
	 * 获取小程序登录地址
	 * 
	 * @author JIANGYOUYAO
	 * @email 935090232@qq.com
	 * @date 2018年5月23日
	 * @param code
	 * @return
	 */
	public static String getXcxLoginUrl(String code) {
		String wechatLoginUrl = PropertiesUtil.getString(WECHAT_LOGIN_URL);
		return String.format(wechatLoginUrl, getAppid(), getSecret(), code);
	}

	/**
	 * 获取小程序APPId
	 * @return
	 */
	public static String  getAppid(){
		if(StringUtils.isBlank(appid)){
			appid = PropertiesUtil.getString(XCX_APPID);
		}
		return  appid;
	}

	/**
	 * 获取小程序秘钥
	 * @return
	 */
	public static String  getSecret(){
		if(StringUtils.isBlank(secret)){
			secret = PropertiesUtil.getString(XCX_SECRET);
		}
		return  secret;
	}



	/**
	 * 清空token
	 */
	public static void cleanAccessToken() {
		preTime = null;
		accessToken = "";
	}

	public static String getAccessToken() throws IOException {

		if (isTokenInvalid()) {
			synchronized (accessToken) {
				if (isTokenInvalid()) {
					LogUtil.info("刷新微信accessToken");
					HttpRequest reqObj = new HttpRequest();
					HttpResponse result = null;
					result = reqObj
							.sendHttpGet("https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid="
									+ getAppid() + "&secret=" + getSecret(), null);
					JSONObject json = JSONObject.fromObject(result.getDataString());
					String access_token = json.getString("access_token");
					accessToken = access_token;
					preTime = System.currentTimeMillis();
					LogUtil.info("返回刷新的accessToken={}", accessToken);
					return access_token;
				} else {
					return accessToken;
				}
			}
		} else {
			LogUtil.info("返回现有accessToken={}", accessToken);
			return accessToken;
		}
	}

	/**
	 * token是否无效
	 *  TODO 由于现在有多个环境，为了防止冲突每次都获取新的token
	 * @return
	 */
	private static boolean isTokenInvalid() {
		/**		if (StringUtils.isNotBlank(accessToken) && preTime != null) {
		 Long now = System.currentTimeMillis() / 1000;
		 Long pre = preTime / 1000;
		 boolean invalid = (now - pre) > 6200;
		 return invalid;
		 } else {
		 return true;
		 }*/
		return true;
	}


}
